﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Model;
using RegraNegocio;
using Util;

namespace ControleDePedidos
{
    public partial class Produto : Form
    {
        private static int CADASTRAR = 0;
        private static int CONSULTAR = 1;

        private List<Model.Fornecedor> fornecedores = null;
        private List<Model.Categoria> categorias = null;
        private List<Model.Fabricante> fabricantes = null;
        private Model.Produto produto = null;

        public Produto()
        {
            InitializeComponent();

            this.populaComboBoxFornecedores();
            this.populaComboBoxCategoria();
            this.populaComboBoxFabricante();

            this.cmbAcao.SelectedIndex = CADASTRAR;
            this.dtgResultado.AutoGenerateColumns = false;
        }

        private void populaComboBoxFornecedores() {
            fornecedores = FornecedorBO.getInstance().recuperarTodosFornecedores();

            cmbFornecedor.DataSource = fornecedores;
            cmbFornecedor.DisplayMember = "nome";
            cmbFornecedor.ValueMember = "codigo";
        }

        private void populaComboBoxCategoria() {
            categorias = CategoriaBO.getInstance().recuperarTodasCategorias();

            cmbCategoria.DataSource = categorias;
            cmbCategoria.DisplayMember = "nome";
            cmbCategoria.ValueMember = "codigo";
        }

        private void populaComboBoxFabricante() 
        {
            fabricantes = FabricanteBO.getInstance().recuperarTodosFabricantes();

            cmbFabricante.DataSource = fabricantes;
            cmbFabricante.DisplayMember = "nome";
            cmbFabricante.ValueMember = "codigo";
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            produto = new Model.Produto();
            String acao = btnSalvar.Text;

            if (acao.Equals("Cadastrar") || acao.Equals("Editar")) {
                Dictionary<String, String> camposValidados = FormularioUtil.getInstance().validarCampos(this.Controls);

                if (camposValidados != null && camposValidados.Count > 0)
                {
                    foreach (var chave in camposValidados)
                    {
                        MessageBox.Show(chave.ToString().Replace(',', ':'), "Atenção");
                    }
                }
                else
                {
                    if (FormularioUtil.getInstance().isDecimal(txtValor.Text) && FormularioUtil.getInstance().isDecimal(txtValorCusto.Text))
                    {

                        this.populaProduto();

                        try
                        {
                            if(acao.Equals("Cadastrar")){
                                ProdutoBO.getInstance().gravar(produto);
                            }else{
                                ProdutoBO.getInstance().editar(produto);
                            }

                            MessageBox.Show(string.Format("Sucesso na inserção/alteração do produto {0} ", produto.Nome), "Sucesso!");

                            FormularioUtil.getInstance().limparCampos(this.Controls);
                        }
                        catch (Exception cause)
                        {
                            MessageBox.Show(string.Format("Erro na inserção do Produto - {0}", cause.Message), "Atenção");
                        }

                    }
                    else
                    {
                        MessageBox.Show("Verifique os valores digitados para os seguintes campos: Valor e Valor Custo!", "Atenção");
                    }

                }
            }
            else if (acao.Equals("Consultar"))
            {
                if (txtCodigo.Text.Equals("") && txtNome.Text.Equals(""))
                {
                    MessageBox.Show("Favor preencher um dos campos para busca: Codigo / Nome", "Atenção");

                    return;
                }

                if (!txtCodigo.Text.Equals(""))
                {
                    if (FormularioUtil.getInstance().isInteiro(txtCodigo.Text))
                    {
                        produto.Codigo = int.Parse(txtCodigo.Text);
                    }
                    else
                    {
                        MessageBox.Show("O código digitado deve ser um número inteiro!", "Atenção");

                        return;
                    }
                }

                if (!txtNome.Text.Equals(""))
                {
                    produto.Nome = txtNome.Text;
                }

                try
                {
                    List<Model.Produto> produtosRecuperados = ProdutoBO.getInstance().recuperarProdutos(produto);

                    if (produtosRecuperados.Any())
                    {
                        FormularioUtil.getInstance().limparCampos(this.Controls);

                        dtgResultado.DataSource = null;
                        dtgResultado.DataSource = produtosRecuperados;

                        dtgResultado.Visible = true;
                    }
                    else {
                        MessageBox.Show("A busca não retornou nenhum resultado!", "Atenção!");
                    }
                }
                catch (Exception cause)
                {
                    MessageBox.Show(cause.Message);
                }
            }
            else {
                String codigoProduto = txtCodigo.Text;

                if (codigoProduto.Equals(string.Empty))
                {
                    MessageBox.Show("Favor preencher o campo Código para exclusão de um produto!", "Atenção");

                    return;
                }

                if (FormularioUtil.getInstance().isInteiro(codigoProduto))
                {
                    try
                    {
                        ProdutoBO.getInstance().excluir(new Model.Produto(int.Parse(codigoProduto)));

                        MessageBox.Show("Sucesso na exclusão do produto - código: " + codigoProduto);

                        FormularioUtil.getInstance().limparCampos(this.Controls);
                    }
                    catch (Exception cause)
                    {
                        MessageBox.Show("Problemas na exclusão do produto: " + cause.Message, "Atenção");
                    }
                }
                else 
                {
                    MessageBox.Show("O campo código deve ser preenchido com números inteiros.", "Atenção");
                }
            }
        }

        private void populaProduto() {
            produto.Codigo = (btnSalvar.Text.Equals("Editar") ? int.Parse(txtCodigo.Text) : 0);
            produto.Nome = txtNome.Text;
            produto.Descricao = txtDescricao.Text;
            produto.Valor = decimal.Parse(txtValor.Text);
            produto.ValorCusto = decimal.Parse(txtValorCusto.Text);
            produto.Fornecedor = new Model.Fornecedor(int.Parse(cmbFornecedor.SelectedValue.ToString()));
            produto.Fabricante = new Model.Fabricante(int.Parse(cmbFabricante.SelectedValue.ToString()));
            produto.Categoria = new Model.Categoria(int.Parse(cmbCategoria.SelectedValue.ToString()));
            produto.QuantidadeEstoque = int.Parse(txtQtdeEstoque.Text);
            produto.QuantidadeMinima = int.Parse(txtQtdeMinima.Text);
        }

        private void cmbAcao_SelectedIndexChanged(object sender, EventArgs e)
        {
            int acaoSelecionada = cmbAcao.SelectedIndex;

            if (acaoSelecionada == CADASTRAR)
            {
                this.camposHabilitadosCadastrar();

                this.btnSalvar.Text = "Cadastrar";
            }
            else if (acaoSelecionada == CONSULTAR) 
            {
                this.camposHabilitadosConsultar(true);

                this.btnSalvar.Text = "Consultar";
            }
            else
            {
                this.camposHabilitadosConsultar(false);

                this.btnSalvar.Text = "Excluir";
            }
        }

        private void camposHabilitadosCadastrar() {
            FormularioUtil.getInstance().limparCampos(this.Controls);

            this.lblCodigo.Visible = false;
            this.txtCodigo.Visible = false;

            this.txtNome.Enabled = true;
            this.txtDescricao.Enabled = true;
            this.txtQtdeEstoque.Enabled = true;
            this.txtQtdeMinima.Enabled = true;
            this.txtValor.Enabled = true;
            this.txtValorCusto.Enabled = true;

            this.cmbCategoria.Enabled = true;
            this.cmbFabricante.Enabled = true;
            this.cmbFornecedor.Enabled = true;

            this.dtgResultado.Visible = false;
            this.dtgResultado.DataSource = null;
        }

        private void camposHabilitadosConsultar(bool isConsulta) {
            FormularioUtil.getInstance().limparCampos(this.Controls);

            this.lblCodigo.Visible = true;
            this.txtCodigo.Visible = true;
            
            this.lblNome.Visible = true;
            this.txtNome.Visible = true;

            this.txtNome.Enabled = isConsulta;
            this.txtDescricao.Enabled = false;
            this.txtQtdeEstoque.Enabled = false;
            this.txtQtdeMinima.Enabled = false;
            this.txtValor.Enabled = false;
            this.txtValorCusto.Enabled = false;

            this.cmbCategoria.Enabled = false;
            this.cmbFabricante.Enabled = false;
            this.cmbFornecedor.Enabled = false;
        }

        private void dtgResultado_Click(object sender, EventArgs e)
        {
            int codigoProduto = int.Parse(dtgResultado.SelectedRows[0].Cells["codigo"].Value.ToString());

            produto = ProdutoBO.getInstance().consultarProduto(codigoProduto);

            this.camposHabilitadosCadastrar();

            this.popularCamposProduto(produto);

            btnSalvar.Text = "Editar";
        }

        private void popularCamposProduto(Model.Produto produto) {
            this.populaComboBoxFornecedores();
            this.populaComboBoxCategoria();
            this.populaComboBoxFabricante();

            this.txtCodigo.Text = produto.Codigo.ToString();
            this.txtNome.Text = produto.Nome;
            this.txtDescricao.Text = produto.Descricao;
            this.txtValor.Text = String.Format("{0:0.00}", produto.Valor);
            this.txtValorCusto.Text = String.Format("{0:0.00}", produto.ValorCusto);
            this.txtQtdeEstoque.Text = produto.QuantidadeEstoque.ToString();
            this.txtQtdeMinima.Text = produto.QuantidadeMinima.ToString();
            this.cmbCategoria.SelectedValue = produto.Categoria.Codigo;
            this.cmbFabricante.SelectedValue = produto.Fabricante.Codigo;
            this.cmbFornecedor.SelectedValue = produto.Fornecedor.Codigo;
        }
    }
}